<?php
/**
 * @version 1.0
 * @since June-2008
 * @package lib
 * @subpackage data
 * @name CFile
 * @deprecated process file
*/
class CFile
{
	/**
	 * Tên file
	*/
	public static $ftp_connection_id = false;
	public $file_name;
	/**
	 * Handle id của file
	*/
	public $id;
	/**
     * Hàm khởi tạo
     * @param string $file_name Tên file
     * @see CFile::$file_name
     */
	function __construct($file_name)
	{
		$this->file_name = $file_name;
	}
	/**
     * Hàm đóng file
     */
	function &close()
	{
		try
		{
			if($this->id)
			{
				fclose($this->id);
				$this->id = false;
			}
		}
		catch(Exception $e)
		{

		}
	}
	/**
     * Hàm mở file
     * @param string $mode Chế độ mở file. "r" là đọc, "w" là ghi, "a" là append, ...
     * @return ref $this Trả lại tham chiếu đến đối tượng cache hiện tại để có thể gọi hàm tiếp     */
	function &open($mode = 'r')
	{
		try
		{
			$this->id = fopen($this->file_name, $mode);
		}
		catch(Exception $e)
		{

		}
		return $this;
	}
	/**
     * Hàm đọc nội dung của file
     * @return string Nội dung của file
     */
	function get()
	{
		try
		{
			return file_get_contents($this->file_name);
		}
		catch(Exception $e)
		{
		}
	}
	/**
     * Hàm đưa nội dung vào file
     * @param string $content Nội dung cần ghi
     * @return $this Trả lại tham chiếu đến đối tượng cache hiện tại để có thể gọi hàm tiếp
     */
	function &put($content)
	{
		try
		{
			file_put_contents($this->file_name, $content);
		}
		catch(Exception $e)
		{

		}
		return $this;
	}
	/**
     * Hàm di chuyển con trỏ file
     * @param int $pos Vị trí cần đến
     * @param int $whence Cách thức di chuyển. Giá trị mặc định là SEEK_SET
     * @return $this Trả lại tham chiếu đến đối tượng cache hiện tại để có thể gọi hàm tiếp
     */
	function &seek($pos, $whence = SEEK_SET)
	{
		try
		{
			fseek($this->id, $pos, $whence);
		}
		catch(Exception $e)
		{
		}
		return $this;
	}
	/**
     * Hàm kiểm tra xem đã đến cuối file chưa
     * @return bool true nếu đến cuối file, false nếu không
     */
	function eof()
	{
		try
		{
			return feof($this->id);
		}
		catch(Exception $e)
		{

		}
		return true;
	}
	/**
                 * Hàm lấy danh sách các file trong thư mục
                 * @return mảng Danh sách các file trong thư mục
                 */
	function files()
	{
		$files = array();
		if(is_dir($this->file_name))
		{
			$dir = opendir($this->file_name);
			while($file = readdir($dir))
			{
				if($file != '.' and $file != '..')
				{
					$files[$file] = $file;
				}
			}
		}
		return $files;
	}

	/**
	 * Xóa file
	 *
	 * @param tên file $filename
	 * @return  bool
	 */
	static function remove($filename, $upload_dir = ""){
		if(CFile::exists($upload_dir . $filename)){
			return @unlink($upload_dir . $filename);
		}else{
			return false;
		}
	}
	function mkdir(){
		$dir_arr  = explode('/',$this->file_name);
		if(strpos($this->file_name, 'ftp://') !== false)
		{
			$start_pos = 3;
			$dir = 'ftp://'.$dir_arr[2].'/'.$dir_arr[3];
		}
		else
		{
			$start_pos = 0;
			$dir = $dir_arr[0];
		}
		for ($i = $start_pos; $i<count($dir_arr); $i++){
			if(!is_dir($dir) && $dir!=''){
				// --khuyennv-- thêm CHMOD cho thư mục vừa tạo
				@mkdir($dir, 0777, true);
			}
			if($i<count($dir_arr)-1){
				$dir = $dir.'/'.$dir_arr[$i+1];
			}
		}
		return $this->file_name;
	}
	function delete($path = false, $remove = false)
	{
		if(!$path)
		{
			$path = $this->file_name;
		}
		if(is_dir($path))
		{
			$dir = opendir($path);
			while($file = readdir($dir))
			{
				if($file != '.' and $file != '..')
				{
					$this->delete($path.'/'.$file,true);
				}
			}
			closedir($dir);
			if($remove)
			{
				rmdir($path);
			}
		}
		elseif(CFile::exists($path))
		{
			unlink($path);
		}
	}
	public static function exists($url)
    {
        if (null === $url || '' === trim($url))
        {
            return false;
        }
		if(preg_match('/^ftp|ftps/',$url))
		{
			$url = str_replace(FTP_PREFIX, '', $url);
			$exists = ftp_size(CFile::ftp_connection_id(), $url)>0;
			return $exists;
		}
		else
		{
			return file_exists($url);
		}
    }
	static public function ftp_connection_id()
	{
		if(!CFile::$ftp_connection_id)
		{
			CFile::$ftp_connection_id = ftp_connect(FTP_HOST);
			ftp_login(CFile::$ftp_connection_id, FTP_USER, FTP_PASSWORD);

			// Switch to passive mode of FTP
			ftp_pasv (CFile::$ftp_connection_id, true);
		}
		return CFile::$ftp_connection_id;
	}
	static function ftp_fput($file_name, $content = false)
	{
		$file_name = str_replace(FTP_PREFIX, '', $file_name);
		if($content)
		{
			CFile(substr($file_name, 0, strrpos($file_name, '/')))->mkdir();
			file_put_contents($file_name, $content);
		}
		$ret = ftp_nb_put(CFile::ftp_connection_id(), $file_name, $file_name, FTP_BINARY);
		while ($ret == FTP_MOREDATA) {
			$ret = ftp_nb_continue(CFile::ftp_connection_id());
		}
	}
	
	// Allowed extensions list in format 'extension' => 'mime type'
	// If myme type is set to empty string then script will try to detect mime type
	// itself, which would only work if you have Mimetype or Fileinfo extensions
	// installed on server.
	public function downloadFile($downloadName = '') {
		if(!file_exists($this->file_name)){
			return false;
		}
		if(!$downloadName){
			$arrFileName = explode('/', $this->file_name);
			$downloadName = $arrFileName[count($arrFileName)-1];
		}
		$downloadName = str_replace('.', '', $downloadName);
		$allowed_ext = array (
			// archives
			'zip' => 'application/zip',
			'rar' => 'application/rar',
			'7z' => 'application/7z',
			
			// documents
			'pdf' => 'application/pdf',
			'doc' => 'application/msword',
			'xls' => 'application/vnd.ms-excel',
			'ppt' => 'application/vnd.ms-powerpoint',
			
			// images
			'gif' => 'image/gif',
			'png' => 'image/png',
			'jpg' => 'image/jpeg',
			'jpeg' => 'image/jpeg',
			'bmp' => 'image/bmp',
			
			// audio
			'mp3' => 'audio/mpeg',
			'wav' => 'audio/x-wav',
			
			// video
			'flv' => 'video/x-flv',
			'swf' => 'application/x-shockwave-flash',
			'pps' => 'application/vnd.ms-powerpoint',
			'ppt' => 'application/vnd.ms-powerpoint',
			'cg3' => 'application/cg3',
			'gsp' => 'application/gsp',
			'doc' => 'application/vnd.ms-word'
		);
		set_time_limit(0);
	
		// file size in bytes
		$fsize = filesize($this->file_name);
		
		// file extension
		$fext = strtolower(substr(strrchr($this->file_name,'.'),1));
		
		// check if allowed extension
		if (!array_key_exists($fext, $allowed_ext)) {
			die("Not allowed file type.");
		}
		
		// get mime type
		if ($allowed_ext[$fext] == '') {
			$mtype = '';
			// mime type is not set, get from server settings
			if (function_exists('mime_content_type')) {
				$mtype = mime_content_type($this->file_name);
			}else if (function_exists('finfo_file')) {
				$finfo = finfo_open(FILEINFO_MIME); // return mime type
				$mtype = finfo_file($finfo, $this->file_name);
				finfo_close($finfo);
			}
			if ($mtype == '') {
			$mtype = "application/force-download";
			}
		}else {
			// get mime type defined by admin
			$mtype = $allowed_ext[$fext];
		}
		
		ini_set('zlib.output_compression', 'Off');
		
		// set headers
		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Cache-Control: public");
		header("Content-Description: File Transfer");
		header("Content-Type: $mtype");
		header("Content-Disposition: attachment; filename=\"$downloadName.$fext\"");
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: " . $fsize);
		
		// download
		// @readfile($this->file_name);
		$file = @fopen($this->file_name,"rb");
		if ($file) {
			session_write_close();
			while(!feof($file)) {
				print(fread($file, 2*1024*1024));
				flush();
				if (connection_status()!=0) {
		  			@fclose($file);
		  			return  false;
				}
			}
			@fclose($file);
		}		
		return true;
	}
	
}
/**
 * Hàm tạo đối tượng CFile
 * @return CFile đối tượng CFile mới tạo
 */
function CFile($file_name=false, $sync=false) {
	if ($sync==false)
		return new CFile($file_name);
	else {
		require_once('CSyncFile.php');
		return new CSyncFile($file_name);
	}
}
?>
